package main.gfs;

import java.util.ArrayList;

import model.gfs.Ticket;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Это главное активити со списком тикетов
 * 
 * @author Cobalt
 * @since 20120129
 */
public class GFSClientActivity extends Activity {
	private String username, password;
	private ProgressBar pb;
	private ArrayList<Ticket> arraytickets;
	private ListView lstTickets;
	private GFSListAdapter adapter;
	public int page;
	private float fromItem;
	View.OnTouchListener gestureListener;
	private boolean isUpdate;

	/**
	 * Класс для отдельного потока в котором будет выполнятся получение тикетов
	 * 
	 * @author Cobalt
	 * 
	 */
	private class AsyncUpdate extends
			AsyncTask<Integer, Void, Pair<String, Boolean>> {

		/**
		 * выполняется перед самим процессом отсюда можно влиятьна визуальные
		 * элементы основной активити
		 */
		@Override
		protected void onPreExecute() {
			setT("Обновляюсь...", true);
			isUpdate = true;
			return;
		}

		/**
		 * выполняется после отработки потока отсюда можно влиятьна визуальные
		 * элементы основной активити
		 */
		@Override
		protected void onPostExecute(Pair<String, Boolean> res) {
			setT(res.first, res.second);
			Toast.makeText(getApplicationContext(), res.first, 50000).show();
			if (res.first.equals("Ошибка авторизации")) {
				// покажем диалог ввода логина:пароля
				showDialog(1);
			}
			adapter.notifyDataSetChanged();
			// lstTickets.setSelectionAfterHeaderView();
			isUpdate = false;
			return;
		}

		@Override
		protected Pair<String, Boolean> doInBackground(Integer... params) {
			// прочитаем конфиг
			SharedPreferences settings = getSharedPreferences("ACCOUNT", 0);
			username = settings.getString("username", null);
			password = settings.getString("password", null);
			if (username == "" || username == null) {
				// если он почему-то пустой
				return new Pair<String, Boolean>("Ошибка авторизации", false);
			}

			String res = "";
			try {
				res = Loader
						.GetHttpsUrl("https://www.gfs-team.ru/xml.php?login="
								+ username + "&password=" + password + "&page="
								+ params[0]);
			} catch (Exception e) {
				Log.e("gfs", e.getMessage());
				return new Pair<String, Boolean>(
						"Не удалось получить тикеты =( ", false);
			}
			try {
				Loader.ParseTickets(res, arraytickets);
			} catch (Exception e) {
				Log.e("gfs", e.getMessage());
				return new Pair<String, Boolean>(e.getMessage(), false);
			}

			return new Pair<String, Boolean>("Тикеты", false);
		}

	}

	/**
	 * Это основной обработчик он вызывается при создании активити и почему-то
	 * при перевороте экрана.
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE); // убираем титл
		setContentView(R.layout.main);

		isUpdate = false;

		// это бля рессивер. поебался я с его выносом в манифест, пришлось так
		// делать. он ловит сигнал от других Активити что нужно обновить список
		registerReceiver(new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				updateData(1);
			}
		}, new IntentFilter("main.gfs.Update"));

		pb = (ProgressBar) findViewById(R.id.progressBar1);
		lstTickets = (ListView) findViewById(R.id.lstTickets);
		lstTickets.setSmoothScrollbarEnabled(false);

		// магия чтобы сохранить текущую страницу при перевороте экрана
		/*
		 * if (savedInstanceState == null) { //page = 1; } else { if
		 * (savedInstanceState.containsKey("page")) // проверяем { page =
		 * savedInstanceState.getInt("page"); // витягиваем } }
		 */

		// обновляем данные
		arraytickets = new ArrayList<Ticket>();
		adapter = new GFSListAdapter(this, arraytickets);

		lstTickets.setAdapter(adapter);
		lstTickets.setOnItemSelectedListener(null);

		// обработчик долгого нажатия
		lstTickets.setOnItemLongClickListener(new OnItemLongClickListener() {
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					int position, long id) {

				Intent intent = new Intent(GFSClientActivity.this,
						CommentTicketActivity.class);

				intent.putExtra("oldticket", arraytickets.get(position));
				startActivity(intent);

				return true;
			}
		});

		// слушатель скролинга
		lstTickets.setOnScrollListener(new OnScrollListener() {
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// Это событие срабатывает при начале и конце скрола.
				// не нужно пока наверно
				// Log.d("scroll", "scrollState = " + scrollState);
			}

			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {

				/*
				 * срабатывает если обновление уже не идет и крутим вниз и
				 * докрутили до последнего итема
				 */
				if (!isUpdate
						&& firstVisibleItem >= fromItem
						&& (firstVisibleItem + visibleItemCount) == totalItemCount) {
					if (totalItemCount >= (page * 10))
						page++;
					updateData(page);
				}
				fromItem = firstVisibleItem;
			}

		});

	}

	/**
	 * вызывается при перевороте экрана для сохранения состояния. тут можно
	 * хранить всякие разные переменные между вызовами onCreate ибо они все
	 * почему-то переинициализируются заново В данном случае сохраняем текущую
	 * страницу
	 */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		outState.putInt("page", page); // ключ должен бить уникальним
	}

	/**
	 * тоже вызывается само при создании активити. тут мы инициализируем наше
	 * меню
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.icon_menu, menu);
		return true;
	}

	/**
	 * вызывается при выборе пункта из меню
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.mnAcc:
			// аккаунт
			showDialog(1);
			break;
		case R.id.mnNew:
			Intent i = new Intent(this, NewTicketActivity.class);
			startActivity(i);
			break;
		case R.id.mnReload:
			updateData(1);
			break;
		}
		return true;
	}

	/**
	 * Эта функция чтобы получить данные с сервера а по сути запускает отдельный
	 * поток для этого
	 */
	public final void updateData(Integer p) {
		new AsyncUpdate().execute(p);
	}

	/**
	 * Эта функция для удобства управления верхней статусбарной строкой
	 * 
	 * @param text
	 *            - типа текст сообщения
	 * @param pbs
	 *            - показываем или нет прогрессбар
	 */
	private void setT(String text, boolean pbs) {
		pb.setVisibility(pbs ? View.VISIBLE : View.INVISIBLE);
		TextView lblTitle = (TextView) findViewById(R.id.lblTitle);
		lblTitle.setText(text);
	}

	/**
	 * создание диалогов вызывается при вызове showDialog(int id)
	 */
	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case 1:
			LayoutInflater inflater = getLayoutInflater();
			View layout = inflater.inflate(R.layout.auth,
					(ViewGroup) findViewById(R.id.auth_layout));
			AlertDialog.Builder builder = new AlertDialog.Builder(this);

			final EditText txtLogin = (EditText) layout
					.findViewById(R.id.txtLogin);
			final EditText txtPassword = (EditText) layout
					.findViewById(R.id.txtPassword);

			SharedPreferences settings = getSharedPreferences("ACCOUNT", 0);
			username = settings.getString("username", null);
			password = settings.getString("password", null);

			txtLogin.setText(username);
			txtPassword.setText(password);

			builder.setView(layout);
			builder.setMessage("Авторизация");
			builder.setPositiveButton("Сохранить",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							// Сохраняем настройки
							SharedPreferences settings = getSharedPreferences(
									"ACCOUNT", 0);
							SharedPreferences.Editor editor = settings.edit();
							editor.putString("username", txtLogin.getText()
									.toString());
							editor.putString("password", txtPassword.getText()
									.toString());
							editor.commit();
							updateData(page);
						}
					});
			builder.setNegativeButton("Отмена",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							// Закрываем диалоговое окно
							dialog.cancel();
						}
					});
			builder.setCancelable(false);
			return builder.create();
		default:
			return null;
		}
	}

	public void OnTitleClick(View v) {
		updateData(1);
	}

}